home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / xbin / spp.c < prev    next >
C/C++ Source or Header  |  1988-09-20  |  2KB  |  103 lines

  1.  
  2.  
  3. /*
  4.  * spp.c
  5.  * Extracts the symbol table from an HP-UX excutable file
  6.  * to be used in a later pass of the linker. (ld does not
  7.  * support the -A option.)
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <a.out.h>
  12.  
  13. filecpy(to, from, n)
  14. FILE *to, *from;
  15. register int n;
  16. {
  17.     char buffer[BUFSIZ];
  18.  
  19.     for (;;)
  20.         if (n > BUFSIZ) {
  21.             fread(buffer, BUFSIZ, 1, from);
  22.             fwrite(buffer, BUFSIZ, 1, to);
  23.             n -= BUFSIZ;
  24.         } else if (n > 0) {
  25.             fread(buffer, 1, n, from);
  26.             fwrite(buffer, 1, n, to);
  27.             break;
  28.         } else
  29.             break;
  30. }
  31.  
  32. stabcpy(to,from,n)
  33. FILE *to, *from;
  34. register int n;
  35. {
  36.     char buffer[BUFSIZ];
  37.     struct nlist_ nbuf;
  38.     int len;
  39.  
  40.     for (;;)
  41.         if (n <= 0) break;
  42.         else {
  43.             fread(&nbuf,sizeof(nbuf),1,from);
  44.             len = nbuf.n_length;
  45.             fread(buffer,len,1,from);
  46.             buffer[len] = '\0';
  47.             nbuf.n_type = EXTERN | ABS;
  48.             if (((strncmp(buffer,"_end",4)   == NULL) &&
  49.                  (len == 4)) ||
  50.                 ((strncmp(buffer,"_etext",6) == NULL) &&
  51.                  (len == 6)) ||
  52.                 ((strncmp(buffer,"_edata",6) == NULL) &&
  53.                  (len == 6)))
  54.                buffer[1] = 'E';
  55.             fwrite(&nbuf,sizeof(nbuf),1,to);
  56.             fwrite(buffer,len,1,to);
  57.             n -= sizeof(nbuf) + nbuf.n_length;
  58.         }
  59. }
  60.  
  61. main(argc,argv)
  62. int argc;
  63. char *argv[];
  64. {
  65.     FILE *file,*sfile;
  66.     struct exec header;    
  67.     char sfile_name[BUFSIZ];
  68.     long skip,size0,size1;
  69.  
  70.     if(argc != 2) { 
  71.         fprintf(stderr,"usage: spp <exefile>\n");
  72.         exit(1);
  73.     }
  74.     if((file = fopen(argv[1],"r")) == NULL) {
  75.         fprintf(stderr,"can't open exefile: %s\n", argv[1]);
  76.         exit(1);
  77.     }
  78.     strcpy(sfile_name,argv[1]);
  79.     strcat(sfile_name,".stb");
  80.     if((sfile = fopen(sfile_name,"w")) == NULL) {
  81.         fprintf(stderr,"can't create stbfile: %s\n", 
  82.             sfile_name);
  83.         exit(1);
  84.     }
  85.     fread(&header,sizeof(header),1,file);
  86.     skip = MODCAL_OFFSET(header);
  87.     size0 = header.a_pasint;
  88.     size1= header.a_dnttsize +
  89.            header.a_sltsize + header.a_vtsize + header.a_trsize +
  90.            header.a_drsize;
  91.     header.a_magic.file_type = RELOC_MAGIC;
  92.     header.a_text = 0;
  93.     header.a_data = 0;
  94.     header.a_bss  = 0;
  95.     fwrite(&header,sizeof(header),1,sfile);
  96.     fseek(file,skip,0);
  97.     filecpy(sfile,file,size0);
  98.     stabcpy(sfile,file,header.a_lesyms);
  99.     filecpy(sfile,file,size1);
  100.     fclose(file);
  101.     fclose(sfile);
  102. }    
  103.